package com.ithema.controller.interception;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*
*     interception拦截器是在表现中运用的，在springmvc中服务的  为了方便  写在controller包下
*
* */
@Component
public class ProjectInterception implements HandlerInterceptor {

    //这里一般写原始条件  方法之前可以做校验   将返回结果是true还是false
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       /* String header = request.getHeader("Content-Type");//可以获取拦截原始方法的请求头   这里举一个例子
        System.out.println(header);*/

/*        //通过handler.getClass();看看类型看出具体是什么类型，出现结果是HandlerMethod类，该类中有getMethod()方法，通过反射原理，可以获取原始方法
        HandlerMethod hm=(HandlerMethod)handler;
        hm.invoke(,);这里就是反射的运用了
        */


        System.out.println("preHandle");
        return true;//这里一定采用true，  如果是false那么只能操作原始操作前的preHandle()方法,后边两个操作后方法执行不了
    }

    // 原始方法运行时  怎么样怎么样的      ModelAndView modelAndView简单了解下    这里被spring里面的fackjson代替了
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }

    // 原始方法 结束后怎么样怎么样的    Exception ex  指   假如原始数据出现异常，这里是可以拿到的，但是这里不需要了，我们通过springmvc的异常处理机制完美的处理异常
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }
}
